package com.wuyan.locationdog.util.maputil;

import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;

import com.amap.api.maps.AMap;
import com.amap.api.maps.model.CustomMapStyleOptions;
import com.amap.api.maps.model.LatLng;
import com.blankj.utilcode.util.ActivityUtils;


import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class MapUtil {

    /**
     * 百度使用的自家BD09LL坐标系，高德和腾讯都是GCJ02即火星坐标系，所以相互之间是需要转换的，不然会有位置偏移。
     * BD-09 坐标转换成 GCJ-02 坐标
     */
    public static LatLng BD2GCJ(LatLng bd) {
        double x = bd.longitude - 0.0065, y = bd.latitude - 0.006;
        double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * Math.PI);
        double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * Math.PI);
        double lng = z * Math.cos(theta);
        double lat = z * Math.sin(theta);
        return new LatLng(lat, lng);
    }

    /**
     * 百度使用的自家BD09LL坐标系，高德和腾讯都是GCJ02即火星坐标系，所以相互之间是需要转换的，不然会有位置偏移。
     * GCJ-02 坐标转换成 BD-09 坐标
     */
    public static LatLng GCJ2BD(LatLng bd) {
        double x = bd.longitude, y = bd.latitude;
        double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * Math.PI);
        double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * Math.PI);
        double tempLon = z * Math.cos(theta) + 0.0065;
        double tempLat = z * Math.sin(theta) + 0.006;
        return new LatLng(tempLat, tempLon);
    }


    /**
     * 检测所选地图是否安装
     * final String[] packageNames = {"com.baidu.BaiduMap", "com.autonavi.minimap", "com.tencent.map"};
     */
    public static boolean isInstalled(String packageName) {
        PackageManager manager = ActivityUtils.getTopActivity().getPackageManager();
        List<PackageInfo> installedPackages = manager.getInstalledPackages(0);
        if (installedPackages != null) {
            for (PackageInfo info : installedPackages) {
                if (info.packageName.equals(packageName))
                    return true;
            }
        }
        return false;
    }

    /**
     * https://lbsyun.baidu.com/index.php?title=uri/api/android
     */
    public static void openBaiduNavi(Context context, String lat, String lng) {
        String string = "baidumap://map/direction?region=" + "&destination=" + lat + "," + lng + "&coord_type=bd09ll&mode=driving&src=andr.landsky.EnercityStreet";
        Intent i1 = new Intent();
        i1.setData(Uri.parse(string));
        context.startActivity(i1);

    }

    /**
     * 打开高德地图
     * https://lbs.amap.com/api/amap-mobile/guide/android/route
     */
    public static void openGaoDeNavi(Context context, String lat, String lng) {
        //dat=amapuri://route/plan/?sid=&slat=39.92848272&slon=116.39560823&sname=A&did=&dlat=39.98848272&dlon=116.47560823&dname=B&dev=0&t=0
        StringBuilder stringBuffer = new StringBuilder("amapuri://route/plan/?sid=")
                .append("&dlat=").append(lat)
                .append("&dlon=").append(lng)
                .append("&dev=").append(0)
                .append("&t=").append(0);
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(stringBuffer.toString()));
        intent.addCategory(Intent.CATEGORY_DEFAULT);
        intent.setPackage("com.autonavi.minimap");
        context.startActivity(intent);
    }

    /**
     * 自定义地图样式
     * 此方法仅适用于地图6.6.0及以上版本
     */
    public static void setMapCustomFile(AMap aMap, Context context) {
        try {
            InputStream inputStream = context.getAssets().open("style.data");
            byte[] b = new byte[inputStream.available()];
            inputStream.read(b);
            inputStream.close();
            CustomMapStyleOptions options = new CustomMapStyleOptions();
            //自定义样式，对应资源包中的style.data
            options.setStyleData(b);

            InputStream is = context.getAssets().open("style_extra.data");
            byte[] bytes = new byte[is.available()];
            is.read(bytes);
            is.close();
            //样式额外的配置，比如路况，背景颜色等，对应资源包中的style_extra.data
            options.setStyleExtraData(bytes);
            aMap.setCustomMapStyle(options);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 打开腾讯地图（公交出行，起点位置使用地图当前位置）
     * <p>
     * 公交：type=bus，policy有以下取值
     * 0：较快捷 、 1：少换乘 、 2：少步行 、 3：不坐地铁
     * 驾车：type=drive，policy有以下取值
     * 0：较快捷 、 1：无高速 、 2：距离短
     * policy的取值缺省为0
     *
     * @param dlat  终点纬度
     * @param dlon  终点经度
     * @param dname 终点名称
     */
    public static void openTencent(Context context, double dlat, double dlon, String dname) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse("qqmap://map/routeplan?type=bus&from=我的位置&fromcoord=0,0"
//                + "&to=" + dname
                + "&tocoord=" + dlat + "," + dlon
                + "&policy=1&referer=myapp"));
        context.startActivity(intent);
    }


    /**
     * 算角度
     *
     * @param lat_a 纬度1
     * @param lng_a 经度1
     * @param lat_b 纬度2
     * @param lng_b 经度2
     * @return
     */
    public static double getAngle(double lng_a, double lat_a, double lng_b, double lat_b) {

        double y = Math.sin(lng_b - lng_a) * Math.cos(lat_b);
        double x = Math.cos(lat_a) * Math.sin(lat_b) - Math.sin(lat_a) * Math.cos(lat_b) * Math.cos(lng_b - lng_a);
        double brng = Math.atan2(y, x);

        brng = Math.toDegrees(brng);
        if (brng < 0)
            brng = brng + 360;
        return brng;

    }

    public static double getAngle2(double lon1, double lat1, double lon2, double lat2) {
        double fLat = Math.PI * (lat1) / 180.0;
        double fLng = Math.PI * (lon1) / 180.0;
        double tLat = Math.PI * (lat2) / 180.0;
        double tLng = Math.PI * (lon2) / 180.0;

        double degree = (Math.atan2(Math.sin(tLng - fLng) * Math.cos(tLat), Math.cos(fLat) * Math.sin(tLat) - Math.sin(fLat) * Math.cos(tLat) * Math.cos(tLng - fLng))) * 180.0 / Math.PI;
        if (degree >= 0) {
            return degree;
        } else {
            return 360 + degree;
        }
    }
    public static double calculateAngle(double lat1, double lon1, double lat2, double lon2) {
        double lat1Rad = Math.toRadians(lat1);
        double lon1Rad = Math.toRadians(lon1);
        double lat2Rad = Math.toRadians(lat2);
        double lon2Rad = Math.toRadians(lon2);

        double deltaLon = lon2Rad - lon1Rad;
        double y = Math.sin(deltaLon) * Math.cos(lat2Rad);
        double x = Math.cos(lat1Rad) * Math.sin(lat2Rad) - Math.sin(lat1Rad) * Math.cos(lat2Rad) * Math.cos(deltaLon);
        double theta = Math.atan2(y, x);

        return Math.toDegrees(theta);
    }

}
